package com.b2mining.integration.xml;

import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.text.SimpleDateFormat;

import org.exolab.castor.mapping.Mapping;
import org.exolab.castor.mapping.MappingException;
import org.jdom.DocType;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

import com.b2mining.daemons.IntegracionSFTPMultiempresa;
import com.b2mining.integration.beans.Empresa;
import com.b2mining.integration.beans.Retention;
import com.b2mining.integration.beans.XMLBean;
import com.b2mining.integration.helper.Constantes;
import com.b2mining.integration.helper.Helper;
import com.b2mining.integration.helper.RequiredElementHelper;
import com.b2mining.integration.mq.MQIntegrationMessage;

/**
 * Clase 
 * @since 19/07/2007
 * @author adminebiz <BR>
 * Analista Programador: Richard Linares
 */
public class RetentionMessageXMLMapper extends XMLMapper{
	 static RetentionMessageXMLMapper controller;    
	    Mapping map;

	    public static RetentionMessageXMLMapper getInstance() throws IOException, MappingException{
	        if(controller==null){
	            controller = new RetentionMessageXMLMapper();
	        }
	        return controller;
	    }
	    
	    
	public void generateXML(XMLBean bean, Writer stream) throws XMLMapperException {
		
		XMLOutputter outputter = new XMLOutputter();
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Constantes.DATEFORMAT);
        outputter.setNewlines(true);
        outputter.setIndent(Constantes.TAB);
        outputter.setEncoding(Constantes.ENCODING_XML);
        Document doc = new Document();
        DocType dt = new DocType("CERTSTATUS", "ret_status_mq.dtd");
        Element element = null;
        doc.setDocType(dt);
        Retention retencion = (Retention)bean;
        Element root = new Element("CERTSTATUS");
        doc.setRootElement(root);
        
		//String documentName = root.getName();
		//String value=null;
		// aav.

		element = new Element("SerieRetencion");
		element.setText(retencion.getSerieRetencion());
		root.addContent(element);
		
		element = new Element("NumeroRetencion");
		element.setText(retencion.getNumRetencion());
		root.addContent(element);
		
		element = new Element("RucComprador");
		element.setText(retencion.getRucComprador());
		root.addContent(element);
		
		element = new Element("RucProveedor");
		element.setText(retencion.getRucProveedor());
		root.addContent(element);
		
		element = new Element("Fecha");
		element.setText(simpleDateFormat.format(retencion.getFechaRetencion()));
		root.addContent(element);
		
		element = new Element("Estado");
		element.setText(retencion.getEstado());
		root.addContent(element);

        try
        {
            outputter.output(doc, stream);
        }
        catch(Exception e)
        {
            throw new XMLMapperException("Error al tratar de escribir el XML OrderStatus hacia la ruta de salida.");
        }
		
	}

	public XMLBean parseXML(Reader stream, Reader streamAux) throws XMLMapperException {
		Retention retencion = null;
		SimpleDateFormat simpleDateFormat = new SimpleDateFormat(Constantes.DATEFORMAT);
		Document doc = null;			
		XMLMapperException ex = new XMLMapperException();
		//.
	
		try {
			doc = validaDocumento(stream, streamAux , ex);
			if (doc==null) {
				throw ex;
			}
		     Element docroot = doc.getRootElement();

			RequiredElementHelper reHelper= new RequiredElementHelper();
			String documentName = docroot.getName();
			String value=null;


			retencion = new Retention();
			
			value =  reHelper.checkValue( docroot.getChild("SerieRetencion")  );
		 	retencion.setSerieRetencion(value);

			value =  reHelper.checkValue( docroot.getChild("NumeroRetencion")  );
            retencion.setNumRetencion(value);
            
            value =  reHelper.checkValue( docroot.getChild("RucComprador")  );
            retencion.setRucComprador(value);
            
            value =  reHelper.checkValue( docroot.getChild("RucProveedor")  );
            retencion.setRucProveedor(value);
            
            value =  reHelper.checkValue( docroot.getChild("Fecha")  );
            retencion.setFechaRetencion(reHelper.parseDate(value, simpleDateFormat));
            
            value = reHelper.checkValue(docroot.getChild("Estado"));
            retencion.setEstado(value);
			
		}
		catch(Exception e){
			throw new XMLMapperException("Error en parseo de XML" + e.toString());
		}
			//aav.
		if (ex.getChildrenCount()>0) {
			throw ex;
		}
		//.		
		return retencion;
	}

	protected void validaContenido(Document doc, XMLMapperException ex) {
		try {
			Element docroot = doc.getRootElement();
			RequiredElementHelper reHelper= new RequiredElementHelper();
			String documentName = docroot.getName();
			String value=null;
			value =  reHelper.checkValue( docroot.getChild("SerieRetencion")  );
			if (!reHelper.isCorrect(documentName,"SerieRetencion", value )) {
				MissingElementException mee = new MissingElementException();
				mee.setElement("SerieRetencion");
				mee.setParent(docroot);
				ex.addChild(mee);
			}

			value =  reHelper.checkValue( docroot.getChild("NumeroRetencion")  );
			if (!reHelper.isCorrect(documentName,"NumeroRetencion", value ))  {
                MissingElementException mee = new MissingElementException();
                mee.setElement("NumeroRetencion");
                mee.setParent(docroot);
                ex.addChild(mee);
            }
			
			value =  reHelper.checkValue( docroot.getChild("RucComprador")  );
			if (!reHelper.isCorrect(documentName,"RucComprador", value ))  {
                MissingElementException mee = new MissingElementException();
                mee.setElement("RucComprador");
                mee.setParent(docroot);
                ex.addChild(mee);
            }
			
			value =  reHelper.checkValue( docroot.getChild("RucProveedor")  );
			if (!reHelper.isCorrect(documentName,"RucProveedor", value ))  {
                MissingElementException mee = new MissingElementException();
                mee.setElement("RucProveedor");
                mee.setParent(docroot);
                ex.addChild(mee);
            }
			
			value =  reHelper.checkValue( docroot.getChild("Fecha")  );
			if (!reHelper.isCorrect(documentName,"Fecha", value ))  {
                MissingElementException mee = new MissingElementException();
                mee.setElement("Fecha");
                mee.setParent(docroot);
                ex.addChild(mee);
            }
			
			value = reHelper.checkValue(docroot.getChild("Estado"));
			if(!reHelper.isCorrect(documentName,"Estado", value)){
				MissingElementException mee = new MissingElementException();
				mee.setElement("Estado");
				mee.setParent(docroot);
				ex.addChild(mee);
			}
            
		}
		catch(Exception e){
			ex.addChild(new  XMLMapperException(e.toString()));
		}
	}

	public void generateXML(XMLBean beanList, Writer stream, int contador)
			throws XMLMapperException {
		// TODO Auto-generated method stub
		//este metodo no tiene codigo debido a que no se usa en esta clase
	}

	/**
	 * Metodo que genera un documento fisico XML de Factura
	 * @see com.b2mining.integration.xml.XMLMapper#parseXML(InputStream)
	 * @param message objeto que contiene el documento mensajeMQ a guardar
	 * @param ret objeto factura que sirve para obtener el nombre del nuevo documento XML
	 * @return objeto boolean que sirve para saber si se ha generado o no el documento 
	 * @throws XMLMapperException
	 */	
	public boolean registrarXML (MQIntegrationMessage message, Retention ret) throws Exception{
        log.debug("RetentionMessageXMLMapper - registrarXML :  INICIO ");
		String nameFile = "";
		String auxliar="";
	/*	String orgid = "";
		String userid = "";
		String action ="";
		String errorCode ="";00
		*/
		boolean resultado = false;
		FileWriter fw = null;
		PrintWriter out = null;
		String fileXML="";
		SimpleDateFormat dateFormatter = new SimpleDateFormat("ddMMyyyy_hhmmssSSS");
		
		try{
			
			nameFile = nameFile + message.getAction().trim()+"_";
			if (message.getDocNumber()!=null)
				nameFile = nameFile + message.getDocNumber().trim()+"_"; 
			nameFile = nameFile + message.getOrgId().trim()+"_";
			nameFile = nameFile + message.getOrgUserId().trim()+"_";
			String fechahora = dateFormatter.format(new java.util.Date());
			nameFile = nameFile +"_" +ret.getNumRetencion()+"_" +fechahora + ".xml";
			log.debug("nameFile del XML a guardar: "+nameFile);
			//fileXML =fileXML+"\\"+ Helper.rutaarchivoxml+"\\"+Helper.rutaempresa+"\\"+Constantes.DIR_RETENCIONES+"\\"+nameFile;
            			
			//nameFile=TXTReader.varnombre;
			//log.info("nameFile del XML a guardar: "+nameFile);
			
			log.debug("VALOR DE AUXLIAR antes de bsucarEmpresa : "+auxliar);
			log.debug("invvv : "+ret.getRucComprador());
			Empresa eu=new Empresa();
			eu=buscarRUC(ret.getRucComprador());
			log.debug("euuu : "+eu.getRAZONSOCIAL());
			auxliar=eu.getRAZONSOCIAL();
			
			log.debug("VALOR DE AUXLIAR despues de buscarEmpresa : "+auxliar);
			fileXML =fileXML+"\\"+ Helper.rutaarchivoxml+"\\"+auxliar+"\\"+Constantes.DIR_FACTURAS+"\\"+nameFile;
			
			fw = new FileWriter(fileXML,false);
			out = new PrintWriter(fw);
			out.println(message.getBody());
			log.debug("###############////////////////////// despues de crear el XML con cuerpo: " + message.getBody());
		 	log.debug("Archivo XML Almacenado en: "+fileXML);	
		 	//resultado = registrarXMLBD(message,nameFile,idCheckpointIntegracion);
		 	resultado=true;
		}
		catch (Exception e){
			log.debug("Error al registrar el XML :"+e);
			resultado = false;
			throw e;
		}
		finally {
			try {
				if (fw != null)
					fw.close();
				if (out != null)
					out.close();
					
			} 
			catch (Exception e) {
			}
		}
		return resultado;
	}

	private Empresa buscarRUC(String rucc) {
		log.debug("rucc: "+rucc);
		Empresa eee=new Empresa();
			for(int csm=0;csm<IntegracionSFTPMultiempresa.empresas.size();csm++){
				
				if(rucc.length()==11){
					if(((Empresa)IntegracionSFTPMultiempresa.empresas.get(csm)).getRUC().substring(2).equalsIgnoreCase(rucc)){
						log.debug("comparando >>> ((Empresa)IntegracionSFTPMultiempresa.empresas.get(csm)).getRUC().substring(2):"+((Empresa)IntegracionSFTPMultiempresa.empresas.get(csm)).getRUC().substring(2)+" y rucCliente: "+rucc);
						eee=(Empresa)IntegracionSFTPMultiempresa.empresas.get(csm);
						break;
					}
				}else if (rucc.length()==13){
					log.debug("comparando >>> ((Empresa)IntegracionSFTPMultiempresa.empresas.get(csm)).getRUC():"+((Empresa)IntegracionSFTPMultiempresa.empresas.get(csm)).getRUC()+" y rucCliente: "+rucc);
					if(((Empresa)IntegracionSFTPMultiempresa.empresas.get(csm)).getRUC().equalsIgnoreCase(rucc)){
						eee=(Empresa)IntegracionSFTPMultiempresa.empresas.get(csm);
						break;
					}
				}
			}
			log.debug("eee: "+eee.getRAZONSOCIAL());
		return eee;
	}
	
	@Override
	protected void validaContenido2(Document doc, XMLMapperException ex) {
		// TODO Auto-generated method stub
		
	}
	
	
}
